package services

import (
	"gitee.com/kun_liu/to-log/app/models"
	"gitee.com/kun_liu/to-log/pkg/database"
	"gorm.io/gorm"
)

// OptionService 选项服务
type OptionService struct {
	db *gorm.DB
}

// NewOptionService 创建选项服务
func NewOptionService() *OptionService {
	return &OptionService{
		db: database.GetDB(),
	}
}

// GetOptions 获取所有选项
func (s *OptionService) GetOptions() (map[string]string, error) {
	var options []models.Option
	result := s.db.Find(&options)
	if result.Error != nil {
		return nil, result.Error
	}

	// 转换为map
	optionMap := make(map[string]string)
	for _, option := range options {
		optionMap[option.Name] = option.Value
	}

	return optionMap, nil
}

// GetOption 获取选项
func (s *OptionService) GetOption(name string) (string, error) {
	var option models.Option
	result := s.db.Where("name = ?", name).First(&option)
	if result.Error != nil {
		return "", result.Error
	}

	return option.Value, nil
}

// SetOption 设置选项
func (s *OptionService) SetOption(name, value string) error {
	// 开始事务
	tx := s.db.Begin()
	defer func() {
		if r := recover(); r != nil {
			tx.Rollback()
		}
	}()

	// 查询选项是否存在
	var option models.Option
	result := tx.Where("name = ?", name).First(&option)

	// 如果选项不存在，则创建
	if result.Error == gorm.ErrRecordNotFound {
		option = models.Option{
			Name:  name,
			Value: value,
		}
		if err := tx.Create(&option).Error; err != nil {
			tx.Rollback()
			return err
		}
	} else if result.Error != nil {
		tx.Rollback()
		return result.Error
	} else {
		// 如果选项存在，则更新
		option.Value = value
		if err := tx.Save(&option).Error; err != nil {
			tx.Rollback()
			return err
		}
	}

	// 提交事务
	return tx.Commit().Error
}

// DeleteOption 删除选项
func (s *OptionService) DeleteOption(name string) error {
	// 开始事务
	tx := s.db.Begin()
	defer func() {
		if r := recover(); r != nil {
			tx.Rollback()
		}
	}()

	// 删除选项
	if err := tx.Where("name = ?", name).Delete(&models.Option{}).Error; err != nil {
		tx.Rollback()
		return err
	}

	// 提交事务
	return tx.Commit().Error
}

// SetOptions 批量设置选项
func (s *OptionService) SetOptions(options map[string]string) error {
	// 开始事务
	tx := s.db.Begin()
	defer func() {
		if r := recover(); r != nil {
			tx.Rollback()
		}
	}()

	// 批量设置选项
	for name, value := range options {
		// 查询选项是否存在
		var option models.Option
		result := tx.Where("name = ?", name).First(&option)

		// 如果选项不存在，则创建
		if result.Error == gorm.ErrRecordNotFound {
			option = models.Option{
				Name:  name,
				Value: value,
			}
			if err := tx.Create(&option).Error; err != nil {
				tx.Rollback()
				return err
			}
		} else if result.Error != nil {
			tx.Rollback()
			return result.Error
		} else {
			// 如果选项存在，则更新
			option.Value = value
			if err := tx.Save(&option).Error; err != nil {
				tx.Rollback()
				return err
			}
		}
	}

	// 提交事务
	return tx.Commit().Error
}
